// #include <iostream>
// #include <functional>
// using namespace std;
// class MyClass {
// public:
//     void print() {
//         std::cout << "Hello from MyClass!" << std::endl;
//     }
// };

// int main() {
//     MyClass obj;
//     auto memFunc = std::mem_fn(&MyClass::print);
//     memFunc(obj);

//     return 0;
// }


#include<iostream>
#include<functional>
#include<vector>
#include<typeinfo>
#include<cassert>
using namespace std;

int main()
{
    // auto x = new int[5];
    // cout << static_cast<int>(*x) << endl;
    vector<function<double(double, double)>> f;
    cout << typeid(f).name() << endl;
    f.emplace_back([](int x, int y) {
        return x + y;
    });
    f.emplace_back([](int x, int y) {
        return x - y;
    });
    f.emplace_back([](int x, int y) {
        return x * y;
    });
    f.emplace_back([](double x, double y) ->double{
        assert(y != 0);
        return x / y;
    });
    for (auto& x : f)
    {
        cout << x(3, 2) << endl;
    }
    return 0;
}